<!DOCTYPE html>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=429547
-->
<head>
  <title>aria-activedescendant focus tests</title>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />

  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>

  <script type="application/javascript"
          src="../common.js"></script>
  <script type="application/javascript"
          src="../role.js"></script>
  <script type="application/javascript"
          src="../states.js"></script>
  <script type="application/javascript"
          src="../events.js"></script>

  <script type="application/javascript">
    //gA11yEventDumpToConsole = true; // debugging

    function changeARIAActiveDescendant(aID, aItemID)
    {
      this.eventSeq = [
        new focusChecker(aItemID)
      ];

      this.invoke = function changeARIAActiveDescendant_invoke()
      {
        getNode(aID).setAttribute("aria-activedescendant", aItemID);
      }

      this.getID = function changeARIAActiveDescendant_getID()
      {
        return "change aria-activedescendant on " + aItemID;
      }
    }

    function insertItemNFocus(aID, aNewItemID)
    {
      this.eventSeq = [
        new invokerChecker(EVENT_SHOW, aNewItemID),
        new focusChecker(aNewItemID)
      ];

      this.invoke = function insertItemNFocus_invoke()
      {
        var container  = getNode(aID);
        var itemNode = document.createElement("div");
        itemNode.setAttribute("id", aNewItemID);
        itemNode.textContent = aNewItemID;
        container.appendChild(itemNode);

        container.setAttribute("aria-activedescendant", aNewItemID);
      }

      this.getID = function insertItemNFocus_getID()
      {
        return "insert new node and focus it with ID: " + aNewItemID;
      }
    }

    var gQueue = null;
    function doTest()
    {
      gQueue = new eventQueue();

      gQueue.push(new synthFocus("listbox", new focusChecker("item1")));
      gQueue.push(new changeARIAActiveDescendant("listbox", "item2"));
      gQueue.push(new changeARIAActiveDescendant("listbox", "item3"));

      gQueue.push(new synthFocus("combobox_entry", new focusChecker("combobox_entry")));
      gQueue.push(new changeARIAActiveDescendant("combobox", "combobox_option2"));

      todo(false, "No focus for inserted element, bug 687011");
      //gQueue.push(new insertItemNFocus("listbox", "item4"));

      gQueue.invoke(); // Will call SimpleTest.finish();
    }

    SimpleTest.waitForExplicitFinish();
    addA11yLoadEvent(doTest);
  </script>
</head>
<body>

  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=429547"
     title="Support aria-activedescendant usage in nsIAccesible::TakeFocus()">
    Mozilla Bug 429547
  </a>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=761102"
     title="Focus may be missed when ARIA active-descendant is changed on active composite widget">
    Mozilla Bug 761102
  </a>
  <p id="display"></p>
  <div id="content" style="display: none"></div>
  <pre id="test">
  </pre>

  <div role="listbox" aria-activedescendant="item1" id="listbox" tabindex="1"
       aria-owns="item3">
    <div role="listitem" id="item1">item1</div>
    <div role="listitem" id="item2">item2</div>
  </div>
  <div role="listitem" id="item3">item3</div>

  <div role="combobox" id="combobox">
    <input id="combobox_entry">
    <ul>
      <li role="option" id="combobox_option1">option1</li>
      <li role="option" id="combobox_option2">option2</li>
    </ul>
  </div>
</body>
</html>
